package com.caochenlei.array;

public class SparseArray {
    /**
     * 打印二维数组的信息
     *
     * @param message 提示信息
     * @param array   二维数组
     */
    public void showArray(String message, int[][] array) {
        System.out.println(message + "：");
        for (int[] row : array) {
            for (int col : row) {
                System.out.printf("%d\t", col);
            }
            System.out.println();
        }
        System.out.println();
    }

    /**
     * 创建测试的二维数组
     *
     * @return 二维数组
     */
    public int[][] createArray() {
        int testArray[][] = new int[10][10];
        testArray[1][1] = 1;
        testArray[1][2] = 2;
        testArray[2][3] = 3;
        return testArray;
    }

    /**
     * 原数组转换为稀疏数组
     *
     * @param array 原数组
     * @return 稀疏数组
     */
    public int[][] toSparseArray(int[][] array) {
        //获取原数组的行数
        int rows = array.length;
        //获取原数组的列数
        int cols = array[0].length;
        //获取非零元素个数
        int sum = 0;
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {
                if (array[i][j] != 0) {
                    sum++;
                }
            }
        }
        //创建一个稀疏数组
        int sparseArray[][] = new int[1 + sum][3];
        //第一部分信息赋值
        sparseArray[0][0] = rows;
        sparseArray[0][1] = cols;
        sparseArray[0][2] = sum;
        //第二部分数据赋值
        int count = 0;
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {
                if (array[i][j] != 0) {
                    count++;
                    sparseArray[count][0] = i;
                    sparseArray[count][1] = j;
                    sparseArray[count][2] = array[i][j];
                }
            }
        }
        //返回一个稀疏数组
        return sparseArray;
    }

    /**
     * 稀疏数组转换为原数组
     *
     * @param sparseArray 稀疏数组
     * @return 原数组
     */
    public int[][] toOriginalArray(int[][] sparseArray) {
        //获取原数组的行数
        int rows = sparseArray[0][0];
        //获取原数组的列数
        int cols = sparseArray[0][1];
        //恢复原数组的数据
        int testArray[][] = new int[rows][cols];
        for (int i = 1; i < sparseArray.length; i++) {
            int row = sparseArray[i][0];
            int col = sparseArray[i][1];
            int val = sparseArray[i][2];
            testArray[row][col] = val;
        }
        //返回一个原数组
        return testArray;
    }
}
